package com.wp.other;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by 王萍 on 2017/9/17 0017.
 */
public class 字符串中找连续最长数字串 {

    /**
     * 在字符串中找出连续最长的数字串，并把这个串的长度返回，
     * 并把这个最长数字串付给其中一个函数参数 outputstr  所指内存。
     * 例如：输入"abcd12345ed125ss123456789" ，输出123456789。
     */
    public static void main(String[] args) {

//        String in = "abcd122345ed125ss123456789";
//        String out = getNumbers(in);
//        System.out.println("最长数字串为：" + out + "   长度为：" + out.length());

        String in = "abcd122345ed125ss123456a789";
        List<String> numberStringList = getAllMaxNumbers(in);
        System.out.println("最长数字串有：");
        numberStringList.forEach(System.out::println);
        System.out.println("数字串长度为：" + numberStringList.get(0).length());
    }

    /**
     * 找出一个最长的数字串。
     */
    private static String getMaxNumbers(String in) {
        char[] chars = in.toCharArray();
        int number = 0;//记录当前遍历的数字串的长度。
        int max = 0;     //记录遍历过程最长数字串的长度
        int start = 0;      //记录数字串的起始位置
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] >= '0' && chars[i] <= '9') {
                number++;
            } else {
                number = 0;
            }
            if (number > max) {
                max = number;
                start = i + 1 - max;
            }
        }
        return in.substring(start, start + max);
    }

    /**
     * 找出所有的最长数字串。完全可以代替上面的函数。
     */
    private static List<String> getAllMaxNumbers(String in) {
        char[] chars = in.toCharArray();
        int number = 0;
        int max = 0;
        List<Integer> startList = new ArrayList();
        List<String> strList = new ArrayList();
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] >= '0' && chars[i] <= '9') {
                number++;
            } else {
                number = 0;
            }
            if (number > max) {
                max = number;
                startList.clear();
//                startList.add( i + 1 - max);   //这里不添加，否则下面的判断会重复添加。
            }
            if (number == max) {
                startList.add(i + 1 - max);
            }
        }
        for (int start : startList) {
            strList.add(in.substring(start, start + max));
        }
        return strList;
    }
}
